﻿using log4net;
using Npgsql;
using PcaCaja.BOL;
using PcaCore.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaCaja.DAL
{
    public class dGrupoMovimiento
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dGrupoMovimiento));
        
        #region Public

        public static long Insert(oGrupoMovimiento myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_add_grupo_movimiento(varchar,--tipo_movimiento_id $1
                //                varchar,--empresa_id $2
                //                varchar,--oficina_id $3
                //                bigint,--sesion_id $4
                //                varchar,--codigo $5
                //                varchar --nombre $6
                //                )RETURNS void
                object id = Core.ExecuteScalar("pca_caja.fn_add_grupo_movimiento",
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.tipo_movimiento_id),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.empresa_id),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.oficina_id),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.sesion_id),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.codigo),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.nombre));

                return Convert.ToInt64(id);
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Update(oGrupoMovimiento myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_update_grupo_movimiento(bigint,--grupo_movimiento_id $1
                //                   varchar,--tipo_movimiento_id $2
                //                   varchar,--empresa_id $3
                //                   varchar,--oficina_id $4
                //                   bigint,--sesion_id $5
                //                   varchar,--codigo $6
                //                   varchar --nombre $7
                //                   )RETURNS void
                Core.ExecuteNonQuery("pca_caja.fn_update_grupo_movimiento",
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.grupo_movimiento_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.tipo_movimiento_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.empresa_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.oficina_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.sesion_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.codigo),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.nombre));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(long grupoMovimientoId, string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_del_grupo_movimiento(bigint,--grupo_movimiento_id $1
                //                varchar --empresa_id $2
                //                )RETURNS void
                Core.ExecuteNonQuery("pca_caja.fn_del_grupo_movimiento",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, grupoMovimientoId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oGrupoMovimiento Get(long grupoMovimientoId, string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_grupo_movimiento(bigint,--grupo_movimiento_id $1
                //                varchar --empresa_id $2
                //                )RETURNS SETOF pca_caja.grupos_movimiento
                return Core.GetObjectDb<oGrupoMovimiento>("pca_caja.fn_get_grupo_movimiento",
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, grupoMovimientoId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oGrupoMovimiento> GetList(int start,
                                                     int limit,
                                                     out int totalRecords,
                                                     string tipoMovimientoId,
                                                     string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_grupos_movimiento(integer,--start $1
                //                 integer,--limit $2
                //                 varchar,--tipo_movimiento_id $3
                //                 varchar --empresa_id $4
                //                 )RETURNS SETOF refcursor 
                return Core.GetListObjecstDb<oGrupoMovimiento>("pca_caja.fn_get_list_grupos_movimiento",
                                                               out totalRecords,
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, tipoMovimientoId),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oGrupoMovimiento> GetList(int start,
                                                     int limit,
                                                     out int totalRecords,
                                                     string tipoMovimientoId,
                                                     string empresaId,
                                                     string query)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_grupos_movimiento(integer,--start $1
                //                 integer,--limit $2
                //                 varchar,--tipo_movimiento_id $3
                //                 varchar,--empresa_id $4
                //                 varchar --query $5
                //                 )RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oGrupoMovimiento>("pca_caja.fn_get_list_grupos_movimiento",
                                                               out totalRecords,
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, tipoMovimientoId),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, query));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
